package com.bjsxt.userscenter.users.service.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.alibaba.dubbo.rpc.RpcContext;
import com.alibaba.fastjson.JSONObject;
import com.bjsxt.userscenter.common.util.ConstatFinalUtil;
import com.bjsxt.userscenter.common.util.PageInfoUtil;
import com.bjsxt.userscenter.users.dao.IAAdminsDao;
import com.bjsxt.userscenter.users.dao.IARoleDao;
import com.bjsxt.userscenter.users.pojo.AAdmins;
import com.bjsxt.userscenter.users.pojo.ARole;
import com.bjsxt.userscenter.users.service.IUsersService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;

/**
 * 用户Service的实现类
 * 
 * @author WangshSxt
 *
 */
@Service("usersService")
public class UsersServiceImpl implements IUsersService
{
	@Resource
	private IAAdminsDao adminsDao;
	@Resource
	private IARoleDao roleDao;

	@Override
	public JSONObject saveOneAdminsService(AAdmins admins)
	{
		JSONObject resultJSON = new JSONObject();

		/* 按照邮箱查询管理员 */
		Map<String, Object> condMap = new HashMap<String, Object>();
		condMap.put("email", admins.getEmail());
		AAdmins adminsRes = this.findOneAdminsService(condMap);
		if (adminsRes != null)
		{
			resultJSON.put("code", "2");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("2"));
			return resultJSON;
		}

		int res = this.adminsDao.save(admins);

		/*
		 * String str = null ; str.toString() ;
		 */

		if (res > 0)
		{
			/* 成功 */
			resultJSON.put("code", "0");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("0"));

			JSONObject dataJSON = new JSONObject();
			/* id */
			dataJSON.put("id", admins.getId());
			/* 影响的条数 */
			dataJSON.put("effect", res);

			resultJSON.put("data", dataJSON);
		} else
		{
			/* 失败 */
			resultJSON.put("code", "1");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("1"));
		}
		return resultJSON;
	}

	@Override
	public AAdmins findOneAdminsService(Map<String, Object> condMap)
	{
		return this.adminsDao.findOne(condMap);
	}

	@Override
	public JSONObject updateOneAdminsService(AAdmins admins)
	{
		JSONObject resultJSON = new JSONObject();

		/*
		 * 修改的时候,邮箱不能重复 先查询一遍,如何做? ~正常的更新,邮箱不更新,下面的情况成立吗
		 * 
		 * HeadController if(res > 0 ) { 成功 }else { 失败 }
		 * 
		 * BackController if(res > 0 ) { 成功 }else { 失败 }
		 * 
		 */
		/* 按照用户名查询管理员 */
		Map<String, Object> condMap = new HashMap<String, Object>();
		condMap.put("email", admins.getEmail());
		AAdmins adminsRes = this.findOneAdminsService(condMap);
		if (adminsRes != null && adminsRes.getId() != admins.getId())
		{
			/*
			 * 什么情况下,进入到此代码 输入的邮箱和其它邮箱一致的时候才进入到这里面 ~根据邮箱肯定可以查询出结果
			 * ~查询出的结果(adminsRes)不是自己(参数中的对象)_(admins),只要两个id不一样
			 */
			resultJSON.put("code", "2");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("2"));
			return resultJSON;
		}

		int res = this.adminsDao.update(admins);

		if (res > 0)
		{
			/* 成功 */
			resultJSON.put("code", "0");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("0"));

			JSONObject dataJSON = new JSONObject();
			/* id */
			dataJSON.put("id", admins.getId());
			/* 影响的条数 */
			dataJSON.put("effect", res);

			resultJSON.put("data", dataJSON);
		} else
		{
			/* 失败 */
			resultJSON.put("code", "1");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("1"));
		}
		return resultJSON;
	}

	@Override
	public JSONObject deleteOneAdminsService(Map<String, Object> condMap)
	{
		JSONObject resultJSON = new JSONObject();
		int res = this.adminsDao.delete(condMap);

		if (res > 0)
		{
			/* 成功 */
			resultJSON.put("code", "0");
			resultJSON.put("info", "成功");

			JSONObject dataJSON = new JSONObject();
			/* 影响的条数 */
			dataJSON.put("effect", res);

			resultJSON.put("data", dataJSON);
		} else
		{
			/* 失败 */
			resultJSON.put("code", "1");
			resultJSON.put("info", "失败");
		}
		return resultJSON;
	}

	/**
	 * 实现了分页功能 实现了查询多条,不分页的功能 如何让两种情况并存,都支持
	 * 
	 * ~Page这个对象和Mybatis插件绑定紧密 ~将来如果换成其它的dao框架,分页就无法使用
	 * ~所有在jsp页面上写的代码都要改(Page里面的属性和其它框架的分页方法的属性不一样)
	 * 
	 * ~要想分页,有两个必备条件???? ~总条数,每页多少条
	 */
	@Override
	public Map<String, Object> findCondListAdminsService(PageInfoUtil pageInfoUtil, Map<String, Object> condMap)
	{
		/*
		 * 定义一个map，去接收传递来的参数，因为参数是引用类型，不能在两个项目中同时存在 所以在需要参数里信息的时候，需要将参数加入到返回值中
		 * 本例的分页用到了总页数和总记录数，需要吧pageinfoutil这个类放入map作用域中
		 */
		Map<String, Object> resultMap = new HashMap<String, Object>();
		/* 处理关键字的模糊匹配 */
		if (condMap.get("keyword") != null)
		{
			condMap.put("keyword", "%" + condMap.get("keyword") + "%");
		}
		if (pageInfoUtil != null)
		{
			/* 分页查询 */
			Page page = PageHelper.startPage(pageInfoUtil.getCurrentPage(), pageInfoUtil.getPageSize());
			List<AAdmins> adminsList = this.adminsDao.findList(condMap);
			/* 分页的两个要素 */
			/* 分页的总记录数 */
			/*
			 * pageInfoUtil.setTotalRecord(Integer.valueOf(page.getTotal() +
			 * ""));
			 */
			pageInfoUtil.setTotalRecord(Long.valueOf(page.getTotal()).intValue());
			/* 设置值 */
			condMap.put("totalRecord", pageInfoUtil.getTotalRecord());
			/*
			 * 生产者消费者存储数据 RPC（远过程调用）在分布式系统中是很常用的基础通讯手段，核心思想是将不同进程之间的通讯抽象为函数调用，
			 * 基本的过程是调用端通过将参数序列化到流中并发送给服务端，服务端从流中反序列化出参数并完成实际的处理，
			 * 然后将结果序列化后返回给调用端。
			 */
			/*
			 * RpcContext rpcContext = RpcContext.getContext() ;
			 * rpcContext.setAttachment("totalRecord",
			 * pageInfoUtil.getTotalRecord() + "");
			 * rpcContext.set("totalRecord", pageInfoUtil.getTotalRecord() +
			 * "");
			 */
			resultMap.put("list", adminsList);
			resultMap.put("totalRecord", pageInfoUtil.getTotalRecord());
			resultMap.put("pageInfoUtil", pageInfoUtil);
			return resultMap;
		}
		List<AAdmins> adminsList = this.adminsDao.findList(condMap);
		resultMap.put("list",adminsList);
		return resultMap;
	}


	@Override
	public JSONObject saveOneRoleService(ARole role)
	{
		JSONObject resultJSON = new JSONObject();
		int res = this.roleDao.save(role);

		/*
		 * String str = null ; str.toString() ;
		 */

		if (res > 0)
		{
			/* 成功 */
			resultJSON.put("code", "0");
			resultJSON.put("info", "成功");

			JSONObject dataJSON = new JSONObject();
			/* id */
			dataJSON.put("id", role.getId());
			/* 影响的条数 */
			dataJSON.put("effect", res);

			resultJSON.put("data", dataJSON);
		} else
		{
			/* 失败 */
			resultJSON.put("code", "1");
			resultJSON.put("info", "失败");
		}
		return resultJSON;
	}

	@Override
	public ARole findOneRoleService(Map<String, Object> condMap)
	{
		return this.roleDao.findOne(condMap);
	}

	@Override
	public JSONObject updateOneRoleService(ARole role)
	{
		JSONObject resultJSON = new JSONObject();
		int res = this.roleDao.update(role);

		if (res > 0)
		{
			/* 成功 */
			resultJSON.put("code", "0");
			resultJSON.put("info", "成功");

			JSONObject dataJSON = new JSONObject();
			/* id */
			dataJSON.put("id", role.getId());
			/* 影响的条数 */
			dataJSON.put("effect", res);

			resultJSON.put("data", dataJSON);
		} else
		{
			/* 失败 */
			resultJSON.put("code", "1");
			resultJSON.put("info", "失败");
		}
		return resultJSON;
	}

	@Override
	public JSONObject deleteOneRoleService(Map<String, Object> condMap)
	{
		JSONObject resultJSON = new JSONObject();
		int res = this.roleDao.delete(condMap);

		if (res > 0)
		{
			/* 成功 */
			resultJSON.put("code", "0");
			resultJSON.put("info", "成功");

			JSONObject dataJSON = new JSONObject();
			/* 影响的条数 */
			dataJSON.put("effect", res);

			resultJSON.put("data", dataJSON);
		} else
		{
			/* 失败 */
			resultJSON.put("code", "1");
			resultJSON.put("info", "失败");
		}
		return resultJSON;
	}

	/**
	 * 实现了分页功能 实现了查询多条,不分页的功能 如何让两种情况并存,都支持
	 * 
	 * ~Page这个对象和Mybatis插件绑定紧密 ~将来如果换成其它的dao框架,分页就无法使用
	 * ~所有在jsp页面上写的代码都要改(Page里面的属性和其它框架的分页方法的属性不一样)
	 * 
	 * ~要想分页,有两个必备条件???? ~总条数,每页多少条
	 */
	@Override
	public List<ARole> findCondListRoleService(PageInfoUtil pageInfoUtil, Map<String, Object> condMap)
	{
		/* 处理关键字的模糊匹配 */
		if (condMap.get("keyword") != null)
		{
			condMap.put("keyword", "%" + condMap.get("keyword") + "%");
		}
		if (pageInfoUtil != null)
		{
			/* 分页查询 */
			Page page = PageHelper.startPage(pageInfoUtil.getCurrentPage(), pageInfoUtil.getPageSize());
			List<ARole> roleList = this.roleDao.findList(condMap);
			/* 分页的两个要素 */
			/* 分页的总记录数 */
			/*
			 * pageInfoUtil.setTotalRecord(Integer.valueOf(page.getTotal() +
			 * ""));
			 */
			pageInfoUtil.setTotalRecord(Long.valueOf(page.getTotal()).intValue());
			return roleList;
		}
		return this.roleDao.findList(condMap);
	}
}
